const port = 4000
const path = require('path')

const Koa = require('koa')
const app = new Koa()

const mongoose = require('mongoose')

// Koa 静态文件服务中间件
const koaStatic = require('koa-static')

// 纯Koa >=2.0.0 JSON 应用程序的错误处理程序，其中显示堆栈跟踪
// 版本>=3.0.0支持 Koa ^2.0.0。对于早期版本的 Koa，请使用以前的版本。
const error = require('koa-json-error')

// 一个功能齐全的koa正文解析器中间件。支持multipart、urlencoded和json请求主体。
const { koaBody } = require('koa-body')

// koa 的参数验证中间件，由参数提供支持。
const parameter = require('koa-parameter')

// 导入路由
const routing = require('./routes')


/**连接数据库 -- start */
const { connectionStr } = require('./config')
async function connectDatabase() {
    try {
        await mongoose.connect(connectionStr);
        console.log(`连接${connectionStr}数据库成功`)
    } catch (error) {
        console.log(error);
    }
}
connectDatabase()
/**连接数据库 -- end */

// 设置静态文件夹
app.use(koaStatic(path.join(__dirname), 'public'))

// 设置错误解析，生产环境下，不展示堆栈信息
app.use(error({
    postFormat: (e, { stack, ...rest }) => process.env.NODE_ENV === 'production' ? rest : { stack, ...rest }
}))

// 设置请求 body 解析器，并且可以使用文件格式
app.use(koaBody({
    multipart: true, // 启用文件，支持文件格式
    formidable: {
        uploadDir: path.join(__dirname, '/public/uploads'), // 设置上传目录
        keepExtensions: true// 保留扩展名
    }
}))

// 校验请求体
app.use(parameter(app))

// 使用路由
routing(app)

app.listen(port, () => {
    console.log(`程序启动在了${port}端口啦`)
})